home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / c_news / 14 / cnews014.doc next >
Text File  |  1989-02-22  |  49KB  |  1,521 lines

  1.  
  2.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  3.  
  4.  
  5.      *-------------------------------------------------------------*
  6.      |  C  NEWS - International C Electronic Newsletter/Journal    |
  7.      |           "Dedicated to the Art of C Programming"           |
  8.      |                                                             |
  9.      |                     Founded 12/27/87                        |
  10.      *-------------------------------------------------------------*
  11.  
  12.  
  13.      Table of Contents
  14.  
  15.      The Heap: Messages from the Editor  ..........................1
  16.      by Barry Lynch
  17.      Book Review: Advanced TurboC  ................................3
  18.      by Richard Hendricks
  19.      Beginner's Corner: The Beginning  ............................5
  20.      by Wayne Dernoncourt
  21.      AWK: An Introduction Part II . ..............................11
  22.      By Dan Kozak
  23.      Interactive C Graphics: Part II  ............................15
  24.      by Scott Houck
  25.      Article Submission Standards ................................19
  26.      Address's ...................................................20
  27.      Distribution Points .........................................21
  28.      User Response Form ..........................................22
  29.  
  30.  
  31.      C News is an Electronic Journal published by the C BBS  in
  32.      Burke, VA  on a monthly basis.  The subject for C News is the C
  33.      programming language, as well  as  any  derivatives  like  C++.
  34.  
  35.      All  readers  are  encouraged  to  submit articles, reviews, or
  36.      comments for submission.  C News  is  freely  distributed,  but
  37.      can  not be sold for a profit, or cannot have a charge assessed
  38.      to cover distribution costs.  To do so is in  direct  violation
  39.      of the  License  agreement.  Copies of which are available from
  40.      the C  BBS.    This  publication  is  Copyrighted   under   U.S
  41.      Copyright Law.
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.                                                                     Page  1
  65.  
  66.  
  67.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  68.  
  69.  
  70.      =====================================================================
  71.      THE HEAP:  Messages from the Editor
  72.      =====================================================================
  73.  
  74.      TABLE OF CONTENTS:
  75.  
  76.        - What's in this issue of C News
  77.        - Postcards wanted
  78.  
  79.      [WHAT'S IN THIS ISSUE OF CNEWS?]
  80.  
  81.  
  82.           This  issue  of  C  News  features  part  II of two articles that
  83.      started in the previous issue:  AWK and Interactive C Graphics.   Also
  84.      in  this  issue  we  start  a  new  column  by  Wayne  Dernoncourt for
  85.      Beginner's.  This new column should assist some of the  readers  of  C
  86.      News that  are  taking a look at "C" for the first time.  In order for
  87.      the column to be of benefit  to  all,  please  provide  us  with  some
  88.      feedback on  the  content.   If something is presented that you do not
  89.      understand.  Send a netmail message, a letter or log  on  to  the  BBS
  90.      and leave  a  message.    Wayne  and  I  will  try  to incorporate any
  91.      feedback received into future issues of C News.
  92.  
  93.      [POSTCARDS WANTED!]
  94.  
  95.  
  96.           Postcards are still  wanted!!    Since  the  last  issue  I  have
  97.      received postcards from the following individuals:
  98.  
  99.           Henk Deutekom - The Netherlands
  100.           Stephan Mes - The Netherlands
  101.           Vin Locke - San Francisco, California
  102.           W.G. Thompson - Bangkok, Thailand
  103.  
  104.  
  105.         So the breakdown of postcards received to date is:
  106.  
  107.           United States            World
  108.  
  109.              Virginia              Montreal, Canada
  110.              New York              The Netherlands
  111.              Maryland              Thailand
  112.              California
  113.  
  114.      [In Closing...]
  115.  
  116.           I  mentioned in the previous paragraph that I received a postcard
  117.      from W. (Bill) Thompson in Thailand.   Bill  is  also  the  CP/M  disk
  118.      librarian of  the  "Bangkok Computer Users Group" or BUGS.  A few days
  119.      ago i received a disk in a pre-paid mailer from Bill  with  a  request
  120.      for a  few  back  issues of C News.  I was very happy to oblige, and I
  121.      will honor similar requests from other user groups.  All of the  files
  122.      on  the  BBS  are  available via the post if you would like to save on
  123.      telephone bills.  Either  send  me  some  diskettes  with  a  pre-paid
  124.      mailer  with a list, or I will charge you a $1(USD) a disk and postage
  125.      (surface).  Either way, I am always willing to fill requests.
  126.  
  127.           Also by the time that you read this, if you are a reader in  "The
  128.  
  129.  
  130.                                                                     Page  2
  131.  
  132.  
  133.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  134.  
  135.  
  136.      Netherlands",  I  have  sent 80 diskettes containing most of the files
  137.      on this BBS to Henk Wevers.  (Henk's address is in the  back  of  this
  138.      issue.)
  139.  
  140.           So,  I hope you enjoy this issue of C News and please send in any
  141.      concerns, questions, bug tips, reviews or whatever  to  the  address's
  142.      listed in the back.
  143.  
  144.                                                            Regards,
  145.  
  146.                                                             Barry
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162.  
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.                                                                     Page  3
  197.  
  198.  
  199.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  200.  
  201.  
  202.      =================================================================
  203.      BOOK REVIEW:  By Richard Hendricks
  204.      =================================================================
  205.  
  206.      Title: Advanced Turbo C, Second Edition
  207.      Author: Herbert Schildt
  208.      ISBN Number: 0-07-881479-0
  209.      Publisher: Osborne McGraw-Hill
  210.                 2600 Tenth Street
  211.                 Berkeley, CA  94710
  212.  
  213.           This  book  is  an updated edition of the original Advanced Turbo
  214.      C. The primary changes to the book are  in  the  area  of  Chapter  6:
  215.      GRAPHICS.  According  to  the  PREFACE, the First Edition included the
  216.      development of a small graphics subsystem,  which  has  been  replaced
  217.      with  a  discussion  of  the  graphics  functions  provided in Turbo C
  218.      Version 1.5.
  219.  
  220.           This book contains 12 chapters and  2  Appendixes.  The  included
  221.      subjects are:    "Sorting  and  Searching",  "Queues,  Stacks,  Linked
  222.      Lists, and Trees", "Dynamic  Allocation",  "Using  System  Resources",
  223.      "Interfacing    with    Assembly   Language   Routines",   "Graphics",
  224.      "Statistics", "Codes and Data Compression", "Random Number  Generators
  225.      and  Simulations",  "Expression  Parsing  and Evaluation", "Converting
  226.      Turbo Pascal to Turbo C", "Efficiency, Porting and Debugging",  "Turbo
  227.      C's Memory Models" and "A Review of Turbo C".
  228.  
  229.           Throughout  the  book  the author includes interesting and useful
  230.      examples. I was impressed with the  creativity  and  accuracy  of  the
  231.      examples.  Techniques described in earlier chapters are used in latter
  232.      chapters, thus providing examples  that  further  the  topics  of  the
  233.      book.
  234.  
  235.           I   enjoyed   reading   this  book,  some  good  solid  technical
  236.      information is supplied and I learned something from each chapter.
  237.  
  238.           I did find some TYPO's in the book. Most  of  them  were  in  the
  239.      GRAPHICS  chapter.  The  author  includes  some  tables  of Predefined
  240.      Macros, that contain errors or omissions. I also  found  an  error  in
  241.      the  description of the 'viewporttype' structure. The author calls the
  242.      fifth element of the structure 'clipflag' and  graphics.h  defines  it
  243.      as  'clip'.  The author's variable name is more descriptive, but Turbo
  244.      C will not accept it. Refer to your Turbo C manual or  the  graphics.h
  245.      header  file,  rather  than  this text, if Turbo C gives you an "Error
  246.      ... Undefined symbol" for graphics related variables and Macros.
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.                                                                     Page  4
  263.  
  264.  
  265.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  266.  
  267.  
  268.           I would recommend this book despite  the  TYPO's  that  I  found.
  269.      The  author  covers  the  subjects  quite  well  and  the examples are
  270.      interesting and helpful. The Cover Price is  $22.95  and  there  is  a
  271.      source disk available from the author at a cost of $24.95.
  272.  
  273.      Richard Hendricks
  274.      22 Maplewood Road
  275.      Tewksbury, Ma 01910
  276.  
  277.      Home: (508) 851-8447
  278.      Work: (617) 594-9692
  279.      FAX : (617) 594-7765
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.                                                                     Page  5
  329.  
  330.  
  331.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  332.  
  333.  
  334.      =====================================================================
  335.      BEGINNER'S CORNER: by Wayne Dernoncourt
  336.      =====================================================================
  337.  
  338.      *** Editor's Note:  Many of you have stated in letters, postcards,
  339.          and phone calls.  That a column dedicated to beginner's would
  340.          be very useful.  Mr. Dernoncourt approached me with some columns
  341.          that he had written for a newsletter at his office and asked
  342.          me if I would be interested in including them in C News.  I
  343.          reviewed them and decided to include his column as a regular
  344.          feature.  So here are the first two columns: Oct and Nov.
  345.          Wayne and I would both appreciate feedback on the content and
  346.          any questions that you might have.
  347.  
  348.                                                          The Ed.
  349.  
  350.  
  351.  
  352.      [PROGRAMMING]
  353.                           [How to Write a Program]
  354.  
  355.           So  your  boss  has  assigned you to write a new program to solve
  356.      one of his most nagging problems.  Or you've heard that there is  this
  357.      great  new  language  called  'C'  and  you want to learn how to write
  358.      programs in it.  In this space in future columns, I'm going to try  to
  359.      introduce  you  both  to  the art/science of writing good programs and
  360.      possibly teaching you some of the aspects of both C.
  361.  
  362.           I plan to use the Borland Turbo-C language in  these  discussions
  363.      whenever  I  present code that has to be system specific, but normally
  364.      I'll try to keep the code portable (not version/platform specific).
  365.  
  366.           You have  the  pleasure  of  writing  a  program,  sounds  pretty
  367.      simple.   All  I do is put in some DIMENSION statements, some DO-LOOPS
  368.      and a bunch of PRINT statements and I'm done right.  Wrong!!
  369.  
  370.           The first step to writing a program of any size is designing  the
  371.      program.   If  you  were  a  new  contractor  and got a job to build a
  372.      house, would you start this job by first going out and buying  a  lot,
  373.      some  lumber,  nails,  etc. before you found out how big the house was
  374.      supposed to be.  I know I wouldn't and I'm willing  to  bet  that  you
  375.      wouldn't either.
  376.  
  377.           The  first  thing  you  would do is to ask the person that you're
  378.      building this house for a couple of things:
  379.  
  380.               1. How big is it going to be (number of bedrooms/baths)?
  381.  
  382.               2. Is there going to be a carport/garage?
  383.  
  384.               3. Do you want to line in the city, suburbs or the
  385.                  country?
  386.  
  387.           Questions that you really need to answer before you  go  out  and
  388.      get land much less get the materials.
  389.  
  390.           So the first step in this process is to:
  391.  
  392.  
  393.  
  394.                                                                     Page  6
  395.  
  396.  
  397.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  398.  
  399.  
  400.           [1. DEFINE THE PROBLEM]
  401.  
  402.           Define  the  problem,  clearly  state  what  your  objective  is.
  403.      Define the scope of what exactly you want your program to do and  what
  404.      you don't  want  it to do.  Write out what your program is supposed to
  405.      accomplish and put it at the  top  of  a  blank  of  piece  of  paper.
  406.      Beneath  this  write what sort of results that you want to come out of
  407.      this program.  Generalities like, I want the correct result to  appear
  408.      on the  screen  are  insufficient.    Be  as specific as possible, for
  409.      example, my checkbook balance curve should be plotted  on  either  the
  410.      CRT or  the HP-7550 plotter attached to my PC.  You can also put here,
  411.      what it won't do, for example, this program will not consider  deficit
  412.      spending (automatic overdraft protection).
  413.  
  414.           Now  that  you've done this very important step, you must develop
  415.      your strategy about how to solve this problem.  Don't let the size  of
  416.      this mountain  over  whelm you.  The important thing is to get it down
  417.      on paper.
  418.  
  419.           Your strategy to conquer this mountain is  very  simple,  convert
  420.      this one  very  large  mountain  into a lot of small molehills.  To do
  421.      this, develop what a method of how  your  program  should  run.    For
  422.      example:
  423.  
  424.               1. Enter data
  425.               2. Process data
  426.               3. Print results
  427.  
  428.           Then   sub-divide  these  smaller  problems  further  into  still
  429.      smaller problems.  Do this by reviewing how the mechanics of  how  you
  430.      would go  about  solving this problem by hand would be done.  Where do
  431.      you get all of the numbers  and  where  do  they  go?    Each  of  the
  432.      solutions  to  these  smaller problems will become modules of the main
  433.      program.
  434.  
  435.           In the past, programs where usually written as  large  monolithic
  436.      programs,  with  only  a few subroutines (as compared to the number of
  437.      lines) with each sub routine having many side effects.
  438.  
  439.           All of this may sound very trivial, but it isn't.   The  flow  of
  440.      the data  around  your  program  is  extremely  important.    The side
  441.      effects mentioned in the previous paragraph for example might  include
  442.      modifying  a variable that although making the program more efficient,
  443.      makes the maintenance on that program much more difficult. Almost  all
  444.      programs  require  maintenance  at  one  time or another, they usually
  445.      start out as "Just a small change here and it  will  be  perfect."  or
  446.      something equally   innocent.      Maintenance   right   now  consumes
  447.      approximately 50-80% as programs mature and age.    Yours,  no  doubt,
  448.      will follow that same curve, unless you take steps now to slow this.
  449.  
  450.           Now,  that  you've  read  almost  a page and a half, I bet you're
  451.      asking when are we going to see some actual coding.  I hate  to  admit
  452.      it, but  you won't for this first installment.  Studies have been done
  453.      that reveal that the better planned a system  is,  the  less  time  is
  454.      spent on  debugging  and maintaining a program.  This is why I'm going
  455.      to emphasize to the degree I am the planning aspect right now!
  456.  
  457.  
  458.  
  459.  
  460.                                                                     Page  7
  461.  
  462.  
  463.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  464.  
  465.  
  466.      =====================================================================
  467.      BEGINNER'S CORNER: by Wayne Dernoncourt   (Part II)
  468.      =====================================================================
  469.  
  470.           In the October column we discussed and  stressed  the  importance
  471.      of  designing  the  program  so  that it did what you wanted it to do.
  472.      You did this by writing down  at  the  top  of  a  blank  piece  paper
  473.      exactly what  the  program was going to do.  You then sub-divided this
  474.      larger problem into smaller, easier to  solve  problem,  writing  down
  475.      descriptions of  how  you  were going to solve this problem.  You only
  476.      want to go one level down.  For example:
  477.  
  478.         This program is to find the mean (average) of a series of
  479.         numbers.  The numbers will be read in from the keyboard (with
  480.         each value followed by a carriage return) and printed on the
  481.         screen.  Enter -1 when finished.
  482.  
  483.             1. Declare all variables needed and initialize them to
  484.                zero.
  485.  
  486.             2. Get 4 numbers from the keyboard (to simplify the
  487.                problem, we will initially use numbers hardcoded into the
  488.                program).  As this column progresses, these simplifications
  489.                will be removed.
  490.  
  491.             3. Perform needed computations
  492.  
  493.             4. Print results
  494.  
  495.             5. Exit the program
  496.  
  497.  
  498.           Give each of  these  sub-problems  descriptive  titles,  such  as
  499.      get_data, compute,  print_results  &  exit.    Note that each of these
  500.      titles are lower-case and use underscores in place of spaces.   The  C
  501.      language  distinguishes  between  upper and lower case. The C language
  502.      doesn't  allow  spaces  to  be  embedded  in  a  variable  name,   use
  503.      underscores instead.    Variables  can  be  up  to 30 characters long.
  504.      Also put these individual steps on separate sheets of  paper.    These
  505.      individual steps  will become the basis for the needed functions.  The
  506.      initialization section  won't  be  a  separate  function  for  reasons
  507.      explained in a later installment of this column.
  508.  
  509.           I  promised  in  the  last  column  that we would start writing a
  510.      program.  Get into your favorite editor.  If it is Wordstar,  use  the
  511.      N (non-document)  mode.    If  you're using Turbo-C, the command would
  512.      be:
  513.  
  514.      TC filename
  515.  
  516.      This will bring up  the  Turbo-C  integrated  development  environment
  517.      with a built-in editor and compiler.
  518.  
  519.           Now  copy what you have written onto the screen and enclose it in
  520.      a pair of comment delimiters "/* ..... */", or:
  521.  
  522.      /* This is Example 2A */
  523.      /*   This program is to find the mean (average) of a series of
  524.  
  525.  
  526.                                                                     Page  8
  527.  
  528.  
  529.  
  530.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  531.  
  532.  
  533.      numbers.  The numbers are read in from the keyboard and printed
  534.      on the screen.  Enter -1 when finished */
  535.  
  536.      The important things about the comment delimiters is that they
  537.      must match and they can't be nested.  For example:
  538.  
  539.      /* This is Example 2B */
  540.      /* /*  This is illegal and should be flagged as an error by the
  541.             compiler you are using!! */ */
  542.  
  543.           Also the Prime C compiler has a problem with extending a  comment
  544.      across lines  as  shown  in  the correct example above.  Example 2A is
  545.      allowed according to the draft ANSI standard and also in Microsoft  C,
  546.      Turbo C  and  VAX/VMS C.  Put each function into its own file and call
  547.      that file by the title that you gave it.  Append the file  type  of  C
  548.      to each  file.    This  indicates that it is a C-language source file.
  549.      Using the example program that we're discussing,  we  would  have  the
  550.      following files:
  551.  
  552.           GET_DATA.C
  553.           COMPUTE.C
  554.           PRINT_RESULTS.C
  555.           EXIT.C
  556.  
  557.           Also  in  each  of  the sub-files, put the title of your function
  558.      and a pair of parentheses after the comment that  describes  what  the
  559.      function is  for.   For example with the first function you would have
  560.      in a file called GET_DATA.C:
  561.  
  562.      /*   2. Get 4 numbers from the keyboard.  To simplify the problem,
  563.              we will initially use numbers hardcoded into the program.
  564.              As this column progresses, these simplifications will be
  565.              removed. */
  566.  
  567.      get_data()
  568.  
  569.           That's the entire file as it stands, 6 lines long.  You  probably
  570.      noticed  that  after  the  phrase  "get_data" is a pair of parentheses
  571.      with nothing in them.  Parentheses is the method that data  is  passed
  572.      into a  function.    Even  if  no  information  is being passed into a
  573.      function, they still must be  present.    We  will  expand  this  file
  574.      shortly.
  575.  
  576.           In  C,  all  "action  commands"  or statements must be terminated
  577.      with a semi-colon (;).  This means that comment lines  don't  have  to
  578.      be  terminated  with a semi-colon and neither do function declarations
  579.      or compiler directives (discussed shortly).   A  function  declaration
  580.      names the  function.    That is why I had you put the title at the top
  581.      of each file.  You can have just one file with all of these  functions
  582.      in  it, but to help you keep the logic behind using functions, we will
  583.      keep them in separate modules and compile and debug  them  separately.
  584.      A  statement  consists of assignment operations, function calls (calls
  585.      to subroutines) or flow control elements.    Compiler  directives  and
  586.      function declarations aren't considered statements.
  587.  
  588.           Using  a  pair  of  braces  /{  ...  }/  can  group any number of
  589.      statements into one logical statement.  For example:
  590.  
  591.  
  592.  
  593.                                                                     Page  9
  594.  
  595.  
  596.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  597.  
  598.  
  599.      {
  600.      In
  601.      English,
  602.      this
  603.      is
  604.      the
  605.      same.
  606.      }
  607.  
  608.      as
  609.  
  610.      In English, this is the same.
  611.  
  612.           The reason that I bring this up is that in C, you can  only  have
  613.      one logical  statement  per function.  Therefore in C, braces are used
  614.      a lot.  So now our init() function looks like:
  615.  
  616.  
  617.      /*   2. Get 4 numbers from the keyboard.  To simplify the
  618.              problem, we will initially use numbers hardcoded into the
  619.              program.  As this column progresses, these
  620.              simplifications will be removed. */
  621.  
  622.      get_data()
  623.      {
  624.  
  625.      }
  626.  
  627.           In C all variables *must* be declared before they're used,
  628.      also the case (either upper or lower) is important in C.  There
  629.      are three main types of declarations:
  630.  
  631.          1. int - declares integers
  632.          2. float - declares real numbers (floating point numbers)
  633.          3. char - declares character variables
  634.  
  635.           Until recently (the draft ANSI standard) the variable type
  636.      int and char could be used interchangeably, and in some cases
  637.      still are.  The variable names follow the same rules as the
  638.      function names do.  So now our function for get_data looks like:
  639.  
  640.      /*   2. Get 4 numbers from the keyboard.  To simplify the
  641.              problem, we will initially use numbers hardcoded into the
  642.              program.  As this column progresses, these
  643.              simplifications will be removed. */
  644.  
  645.      float get_data()
  646.      {
  647.           float sum_x=0.0;
  648.  
  649.           sum_x = sum_x + 1.0;   /* Start here*/
  650.           sum_x = sum_x + 2.0;
  651.           sum_x = sum_x + 3.0;
  652.           sum_x = sum_x + 4.0;   /* End here*/
  653.  
  654.      /* Now is the time to return back to the main program. */
  655.           return(sum_x);
  656.      }
  657.  
  658.  
  659.                                                                    Page  10
  660.  
  661.  
  662.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  663.  
  664.  
  665.           The variable sum_x is initialized to zero when it is declared  in
  666.      the float  statement.  The word float at the beginning of the function
  667.      declaration declares that the function will  declare  a  real  number.
  668.      All  functions  should declare what kind of value will be returned (if
  669.      any).
  670.  
  671.           The operation of adding the variable sum_x to another number  and
  672.      storing  that  back  into  the  variable  sum_x  is  a  fairly  common
  673.      occurrence.  So much so that the developers of  C  decided  that  that
  674.      operation  could  be  done  just  as  well  with  what  is  called the
  675.      assignment operator.    This  replaces  the  four  lines  given  above
  676.      between  the  comments /* Start here*/ and /* End here*/ with the code
  677.      given between the same delimiters:
  678.  
  679.  
  680.      /*   2. Get 4 numbers from the keyboard.  To simplify the
  681.              problem, we will initially use numbers hardcoded into the
  682.  
  683.              program.  As this column progresses, these
  684.              simplifications will be removed. */
  685.  
  686.      float get_data()
  687.      {
  688.           float sum_x=0.0;
  689.  
  690.           sum_x += 1.0;   /* Start here*/
  691.           sum_x += 2.0;
  692.           sum_x += 3.0;
  693.           sum_x += 4.0;   /* End here*/
  694.  
  695.      /* Now is the time to return back to the main program. */
  696.           return(sum_x);
  697.      }
  698.  
  699.           Well that's it for this month.  Next month we'll write  the  main
  700.      program,  the remaining functions and discuss the details of compiling
  701.      and linking the program using Turbo-C.
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.                                                                    Page  11
  727.  
  728.  
  729.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  730.  
  731.  
  732.      =====================================================================
  733.      An Introduction to AWK by Dan Kozak  -  Part II
  734.      =====================================================================
  735.  
  736.  
  737.      AWK AWK
  738.  
  739.           Lest you think you're in an aviary, let me assure you:   this  is
  740.      the part  two  of  the AWK article.  Now I didn't know that this was a
  741.      multi-part article until I saw the first part in print (on-screen  ?),
  742.      but then I got an idea . . .
  743.  
  744.      Same C Time, same C channel . . .
  745.  
  746.           If  you  remember last time you tuned in, Jim and Barry were just
  747.      starting their OpusGraf project.  In part 1 of that series  they  gave
  748.      the  design  specs  for  the utility -- basically a graphic display of
  749.      time usage on an Opus BBS system.    Now  AWK  doesn't  have  graphics
  750.      capability, but  it can graph data using a histogram.  So I've whipped
  751.      up a small AWK program to do the job.   It  doesn't  include  all  the
  752.      features that  Jim and Barry specified, but does get the job done.  It
  753.      limitations are:
  754.  
  755.           o only displays callers (not other BBS activity like File
  756.             Requests)
  757.           o not graphic, just a histogram of *'s
  758.           o fixed resolution (half-hour intervals)
  759.           o must specify bbs name on command line (could be run from
  760.             batch file though)
  761.           o slow (about 1 sec per 2k of log file size though actual
  762.             mileage may vary)
  763.           o no options
  764.  
  765.  
  766.           Since AWK writes to standard output the graph can  be  redirected
  767.      to  a  file  for later display, but this is not an integral feature of
  768.      the program.
  769.  
  770.      [The program]
  771.  
  772.           I'm not going to say alot about the program because I  feel  that
  773.      part  of  becoming  fluent  in  a language is learning how to read its
  774.      programs.  However, here are a few things to look for:
  775.  
  776.  
  777.           o our basic data structure is an associative array, see how
  778.             AWK handles alot of the dirty work for us, but note how
  779.             careful we need to be about our subscripts
  780.  
  781.           o those of you with the AWK book may recognize the rep
  782.             function from the histogram program there.  While it is
  783.             certainly an example of good modular coding to make this a
  784.             separate function, it is noticeably less efficient.  As an
  785.             exercise, incorporate it into the END block as inline
  786.             code.
  787.  
  788.           o the same goes for the code to allow you to put the BBS
  789.             name on the command line -- hard code it for speed.
  790.  
  791.  
  792.  
  793.                                                                    Page  12
  794.  
  795.  
  796.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  797.  
  798.  
  799.           o what would you need to change to make the resolution
  800.             variable (i.e. hour intervals or 15 minute intervals)?
  801.  
  802.  
  803.      [Running the program]
  804.  
  805.           Those of you who aren't OPUS sysops will need a  sample  OPUS.LOG
  806.      file to  run this on.  If your friendly neighborhood sysop can't/won't
  807.      make one available (I don't see why they shouldn't  since  it  doesn't
  808.      reveal  passwords  or  anything  like that), you can download/FREQ one
  809.      from the C BBS -- it's called OPUSSAMP.ZOO.   (It  was  too  large  to
  810.      include here).   You may notice that it takes 4-6 days data (depending
  811.      on traffic) before you get much of a graph -- why is this?  how  could
  812.      you make a more frequent graph look more impressive?
  813.  
  814.      [Finis]
  815.  
  816.           Well,  that  about  covers  it . . . a quick and dirty Opus usage
  817.      graph.  You may have noticed this is really more of an example than  a
  818.      full  blown  article  but  I'm  available  on  the C BBS to answer any
  819.      questions or just get feedback.  Rob Duff's  AWK  is  available  there
  820.      for  those  of  you  who  don't  already  have  it and actually I must
  821.      recommend it as a free AWK because the GNU Project AWK (GAWK)  doesn't
  822.      seem  to  work  very well under DOS at this time (something I'm trying
  823.      to find time to fix).  Without further ado (since  I've  used  all  my
  824.      ado up), here's opusgraf.awk:
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840.  
  841.  
  842.  
  843.  
  844.  
  845.  
  846.  
  847.  
  848.  
  849.  
  850.  
  851.  
  852.  
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.                                                                    Page  13
  860.  
  861.  
  862.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  863.  
  864.  
  865.      #
  866.      # opusgraf.awk - makes a histogram of Opus BBS caller usage
  867.      #
  868.  
  869.      BEGIN { # get the bbs name from the command line
  870.              bbs_name = ARGV[ARGC - 1]
  871.  
  872.              # then null it out so it wont be interpreted as a file
  873.              # name
  874.              ARGV[ARGC - 1] = ""
  875.  
  876.              # initialize an array with entries for each half-hour
  877.              # period
  878.                for(hour = 0;hour < 24;hour++) {
  879.                 hour = (length(hour) < 2) ? ("0" hour) : hour
  880.                 for(min = "00";min < 60;min += 30)
  881.                  humans[hour ":" min] = 0;
  882.                 }
  883.                }
  884.  
  885.      # we're only interested in callers
  886.      /calling/ {
  887.                 # some log entries have a blank first field, so
  888.                 # we have to compensate
  889.                 if ($4  /:/)
  890.                  fld = 4
  891.                 else
  892.                  fld = 3
  893.  
  894.                 # save the first and last dates
  895.                 if (startdate == "")
  896.                  startdate = $(fld - 1) " " $(fld - 2)
  897.                 else
  898.                  enddate = $(fld - 1) " " $(fld - 2)
  899.  
  900.                 # process the hour entry, remove ":" if necessary and
  901.                 # pad with 0's
  902.                 hour = substr($fld,1,2)
  903.                 if (sub(":","",hour))
  904.                  hour = (length(hour) < 2) ? ("0" hour) : hour
  905.  
  906.                 # process the minutes entry, rounding off at
  907.                 # half-hour intervals
  908.                 min  = substr($fld,4,2)
  909.                 if (min < 30)
  910.                  min = 0
  911.                 else
  912.                  min = 30
  913.  
  914.                 # assemble the index string
  915.                 timestring = hour ":" ((min == 0) ? "00" : min)
  916.  
  917.                 # increment the value
  918.                 humans[timestring]++
  919.                }
  920.  
  921.  
  922.      END {
  923.  
  924.  
  925.                                                                    Page  14
  926.  
  927.  
  928.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  929.  
  930.  
  931.           # put the name of the BBS on the command line
  932.           printf("Stats for %s from %s to %sn",
  933.            bbs_name,startdate,enddate)
  934.  
  935.           # generate the histogram
  936.           for(time in humans) {
  937.               printf("%sn",time,rep(humans[time],"*"))
  938.           }
  939.          }
  940.  
  941.      # separate function to create string of *'s
  942.      function rep(n,s,   t) {
  943.       while(n-- > 0)
  944.           t = t s
  945.       return t
  946.      }
  947.  
  948.  
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968.  
  969.  
  970.  
  971.  
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978.  
  979.  
  980.  
  981.  
  982.  
  983.  
  984.  
  985.  
  986.  
  987.  
  988.  
  989.  
  990.  
  991.                                                                    Page  15
  992.  
  993.  
  994.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  995.  
  996.  
  997.      =====================================================================
  998.      Interactive Graphics Programming Using Turbo C -- Part 2
  999.                               by Scott Houck
  1000.      =====================================================================
  1001.  
  1002.      [INTRODUCTION]
  1003.  
  1004.           This  is  the  second  in  a  series  of  articles on interactive
  1005.      graphics using Turbo C.  I chose  Turbo  C  because  of  its  powerful
  1006.      graphics package.
  1007.  
  1008.           First, a  note  concerning  Part  1.    A  reader  asked what the
  1009.      following comment in the  source  code  meant:    "Add  egavga.bgi  to
  1010.      graphics.lib".   By  this  I  meant  that  the  reader  should use the
  1011.      program BGIOBJ.EXE to convert the file EGAVGA.BGI  to  an  .OBJ  file.
  1012.      Then use  TLIB  to  add  the  object  file  to  GRAPHICS.LIB.  See the
  1013.      appendix in the Reference Guide for further details.
  1014.  
  1015.           In Part 1, I promised to present  a  simple  paint  program  that
  1016.      would  demonstrate  pull-down menus, "rubber banding" techniques, fill
  1017.      patterns, and mouse cursor  programming.    As  the  program  grew  in
  1018.      complexity,  I  decided  not  to cover pull-down menus in this article
  1019.      since that is a topic that could span an  entire  article  in  itself.
  1020.      The  other  items  are  included,  along  with  a  discussion  of  the
  1021.      important issue of user input.
  1022.  
  1023.      [HOW TO USE THE PROGRAM]
  1024.  
  1025.           To use the program, you must have either an EGA or a VGA,  and  a
  1026.      Microsoft-compatible mouse.    When  you start up the program, you are
  1027.      in "paint" mode and the PAINT button  is  highlighted.    There  is  a
  1028.      white  drawing  area,  and  you  draw  by  holding down the left mouse
  1029.      button while moving the mouse.  Lift up on the mouse  button  to  stop
  1030.      drawing.
  1031.  
  1032.           The  initial  drawing color is black, and the background color is
  1033.      white.  A square at the bottom lefthand side of the screen  shows  the
  1034.      current drawing  color and background color status.  The drawing color
  1035.      is  represented  by  the  inner  box,  and  the  background  color  is
  1036.      represented by  the  border.    To change the drawing color, click the
  1037.      left mouse button on one of the sixteen colors that stretch along  the
  1038.      bottom of  the  screen.    To  change the background color, click on a
  1039.      color with the right button.
  1040.  
  1041.           Under the PAINT button  is  the  FILL  button.    Click  on  this
  1042.      button, and  you  will be in "fill" mode.  Now when you click with the
  1043.      left button while inside the drawing area, the object you select  will
  1044.      be filled  with the background color.  You may choose a different fill
  1045.      pattern other than the initial solid fill pattern  by  clicking  on  a
  1046.      pattern box  at  the  bottom of the screen.  Be careful to click on an
  1047.      enclosed area or the "paint" will  overflow  to  other  parts  of  the
  1048.      screen.
  1049.  
  1050.           You  can  erase  what  you've  done  by  clicking  on  the ERASER
  1051.      button.  When you move the cursor inside the drawing area, the  cursor
  1052.      will change  its  shape from an arrow to a small rectangle.  To erase,
  1053.      hold down on the left mouse button and move the mouse  until  you  are
  1054.      finished.   Then  release  the  button  and  choose  another button to
  1055.  
  1056.  
  1057.                                                                    Page  16
  1058.  
  1059.  
  1060.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1061.  
  1062.  
  1063.      continue.  Choose PAINT, for example, to continue drawing.
  1064.  
  1065.           The screen can be cleared by clicking on  the  CLEAR  button  and
  1066.      then clicking  on YES from the dialog box.  The screen will be cleared
  1067.      in the current background color and fill pattern.
  1068.  
  1069.           LOAD and SAVE allow you to store pictures in files.    The  files
  1070.      have  a  default  extension  of  .PIC,  so when you are prompted for a
  1071.      filename, do not type in an extension.  Since the  "undo"  feature  is
  1072.      left  to  the reader as an exercise, you may want to save your picture
  1073.      before doing something dangerous like filling an object.  The  default
  1074.      filename is  PAINT.PIC.  If you want the default, just press the ENTER
  1075.      key.  Otherwise, type in a new filename.
  1076.  
  1077.           QUIT will terminate the program after  confirmation.    The  last
  1078.      two buttons  show  a rectangle and a line.  These are the "rubberband"
  1079.      figures.  To draw a rectangle, for example, click  on  the  rectangle,
  1080.      then  click  inside  the  drawing  area  to  anchor  the rectangle and
  1081.      continue to hold down on the left mouse button.  Now  move  the  mouse
  1082.      to expand  or  contract  the rectangle.  Release the mouse button when
  1083.      you are finished.  The rubber line works the same way.
  1084.  
  1085.      [PROGRAMMING CONCEPTS]
  1086.  
  1087.           This program expands on some of the concepts presented in Part  1
  1088.      of this  series.    The  same  mouse  functions  are  used,  and  pick
  1089.      correlation is still required to determine where the user has  clicked
  1090.      the mouse.    The  colors and fill patterns are drawn at the botton of
  1091.      the screen.  When the user clicks on one of the color boxes  with  the
  1092.      left button,  a  call  to setcolor() is made.  If the right button was
  1093.      used, the background color is set in the variable fillColor.   Then  a
  1094.      call to setfillstyle() is used with this color.
  1095.  
  1096.           Painting is  very  simple  to program.  It is accomplished in the
  1097.      DoPaint() function.  I simply loop while the button  is  down,  making
  1098.      calls to  lineto()  from  the  old  position  to the new position.  In
  1099.      order to avoid flicker of the mouse cursor, I only  call  lineto()  if
  1100.      the cursor position has changed.
  1101.  
  1102.           Filling an  area  is  also  fairly  simple.    There  is a slight
  1103.      complexity, however.  The  floodfill()  function  needs  to  know  the
  1104.      border color  of  the area to be filled.  Since this is an interactive
  1105.      program, I used getpixel() on the current position to  get  the  color
  1106.      of the  area's  interior.    Then  I loop, incrementing the x position
  1107.      until the color changes, at which point I assume the border  has  been
  1108.      reached.  Look at the DoFill() function to see how this was done.
  1109.  
  1110.      [MOUSE CURSORS]
  1111.  
  1112.           I implemented  the eraser as a different cursor shape.  There are
  1113.      other ways of implementing an eraser, but I wanted to experiment  with
  1114.      mouse function   number  9  (Set  Graphics  Cursor).    This  function
  1115.      requires an array as its argument.  The array  contains  a  bitmap  of
  1116.      the cursor  broken  down  into  two  parts:    the screen mask and the
  1117.      cursor mask.  There are two arrays at  the  beginning  of  the  source
  1118.      code.   One  is  for  the  eraser,  and  the other is for the standard
  1119.      cursor.  When the "eraser cursor" moves out of  the  drawing  area,  I
  1120.      restore the mouse cursor to the "standard cursor".
  1121.  
  1122.  
  1123.                                                                    Page  17
  1124.  
  1125.  
  1126.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1127.  
  1128.  
  1129.           The  screen mask is used to determine whether the cursor pixel is
  1130.      part of the shape or the background.  The cursor mask is the shape  of
  1131.      the cursor  itself  and  also determines the color of the cursor.  The
  1132.      mouse driver ANDs the screen mask with the bits on the screen.    Then
  1133.      the cursor  mask  is  XORed  with  the  result.   This allows a lot of
  1134.      flexibility in the types of cursors you can  create.    You  can  have
  1135.      solid cursors  or  "see-through"  cursors.    The  eraser cursor is an
  1136.      example of  the  latter.    The  parts  of   the   cursor   that   are
  1137.      "see-through"  have  a  1  for  the screen mask and a 0 for the cursor
  1138.      mask.
  1139.  
  1140.      [MOUSE-ON/MOUSE-OFF]
  1141.  
  1142.           Throughout the code,  you  will  notice  that  I  often  envelope
  1143.      procedures with  calls to MouseOff() and MouseOn().  This is necessary
  1144.      whenever the screen is updated -- when drawing or  saving  the  screen
  1145.      image.   If  this  is  not  done,  the  cursor  gets in the way of the
  1146.      updating, and in the case of a screen save, will  itself  be  included
  1147.      in the file unless specifically turned off.
  1148.  
  1149.      [USER INPUT]
  1150.  
  1151.           I  spent  quite  a bit of time writing the code that would accept
  1152.      an eight-character filename from the  user.    It  is  still  not  the
  1153.      friendliest  prompt, but the code will give you an idea of some of the
  1154.      complexities involved in prompting for input in a graphics program.
  1155.  
  1156.           First of all, I needed an area for input.  I  decided  to  use  a
  1157.      pop-up box,  implemented  with  getimage()  and  putimage().  The high
  1158.      level routine PromptForFile() gets the filename.   It  calls  a  lower
  1159.      level routine  GetString(),  which in turn calls GetChar().  GetChar()
  1160.      only gets one character but doesn't return until  it  gets  a  "legal"
  1161.      character.   It  can  also be used to get function keys if you specify
  1162.      the scan codes it can  accept.    GetString()  loops  until  the  user
  1163.      presses the ENTER  key.  Each keystroke is processed.  It checks for a
  1164.      backspace, the Escape key,  an  optional  function  key,  and  "legal"
  1165.      keys.  A  default  value  is first displayed.  If the user presses the
  1166.      Escape key, the default reappears.    If  function  keys  need  to  be
  1167.      processed,  they  are  handled  by  passing a pointer to a key handler
  1168.      routine.
  1169.  
  1170.           The input was a lot of work, but it is still rudimentary.   There
  1171.      is no  text-like  cursor  in  the  prompt  box.  This would have to be
  1172.      programmed in.  Also, the DoLoad() and DoSave()  functions  should  be
  1173.      enhanced  to  tell  the  user  if a file that he wants to load doesn't
  1174.      exist (it just beeps for now), or to ask  for  confirmation  when  the
  1175.      user is about to overwrite a file when saving.
  1176.  
  1177.      [RUBBERBANDING TECHNIQUES]
  1178.  
  1179.           The rubberbanding  technique  is  really  quite  simple too.  The
  1180.      trick is to use the XOR write mode.  Drawing twice in XOR mode  causes
  1181.      the line  to  be  erased  and the background restored.  Unfortunately,
  1182.      the Turbo C manual plainly states  that  the  setwritemode()  function
  1183.      does  not  yet  work  with  ellipses,  so I did not implement a rubber
  1184.      ellipse.
  1185.  
  1186.      [ENHANCEMENTS]
  1187.  
  1188.  
  1189.                                                                    Page  18
  1190.  
  1191.  
  1192.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1193.  
  1194.  
  1195.           If you are interested in Turbo C and its  graphics  package,  try
  1196.      experimenting with the  program.    Try to add some new features.  One
  1197.      good feature would be to include an "undo".  To  do  this,  you  could
  1198.      periodically  make  calls to getimage() to save the current screen and
  1199.      putimage() to restore it when the user chooses the undo feature.   You
  1200.      might also  want  to  experiment with different cursors.  Try making a
  1201.      special paintbrush cursor when you are  in  paint  mode,  or  a  paint
  1202.      roller when you are in fill mode.
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253.  
  1254.  
  1255.                                                                    Page  19
  1256.  
  1257.  
  1258.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1259.  
  1260.  
  1261.      =====================================================================
  1262.      ARTICLE        SUBMISSION        STANDARDS        AND        ADDRESSES
  1263.      =====================================================================
  1264.  
  1265.           As I have repeatedly  stated  in  this  newsletter  and  previous
  1266.      issues,  I  would  like  to  see  user-submitted  articles, reviews or
  1267.      questions.  Listed below are the standards that should be followed  to
  1268.      make my job easier as an editor.
  1269.  
  1270.  
  1271.            - Articles should be submitted in a ASCII non-formatted
  1272.              file.  (Margins 0-65 PLEASE)
  1273.  
  1274.            - If the article include code fragments as examples. Then
  1275.              you can include the entire source file if you like for
  1276.              inclusion with the newsletter.
  1277.  
  1278.            - Book or magazine reviews should follow the same format,
  1279.              that is outlined in this issue.  The publisher, author,
  1280.              title, and ISBN number are a must.
  1281.  
  1282.            - Compiler/and or product reviews, should include the
  1283.              version number and manufacture.  If possible, reviews
  1284.              should include a sample program with benchmarks.
  1285.  
  1286.           If you have any questions you can contact me at the address's
  1287.      included on the next page.
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296.  
  1297.  
  1298.  
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305.  
  1306.  
  1307.  
  1308.  
  1309.  
  1310.  
  1311.  
  1312.  
  1313.  
  1314.  
  1315.  
  1316.  
  1317.  
  1318.  
  1319.  
  1320.  
  1321.                                                                    Page  20
  1322.  
  1323.  
  1324.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1325.  
  1326.  
  1327.      =====================================================================
  1328.      HOW YOU CAN REACH THE AUTHORS OF C NEWS
  1329.      =====================================================================
  1330.  
  1331.             ADDRESSES
  1332.  
  1333.             The C BBS is located at:
  1334.  
  1335.             C BBS
  1336.             % BCL Limited
  1337.             P.O. Box 9162
  1338.             McLean VA, 22102
  1339.  
  1340.  
  1341.             or you can send netmail to:
  1342.  
  1343.  
  1344.             1:109/307
  1345.  
  1346.             or MCI Mail to:  BCL Limited
  1347.  
  1348.  
  1349.  
  1350.  
  1351.  
  1352.  
  1353.  
  1354.  
  1355.  
  1356.  
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.  
  1375.  
  1376.  
  1377.  
  1378.  
  1379.  
  1380.  
  1381.  
  1382.  
  1383.  
  1384.  
  1385.  
  1386.  
  1387.                                                                    Page  21
  1388.  
  1389.  
  1390.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1391.  
  1392.  
  1393.      =====================================================================
  1394.                             DISTRIBUTION POINTS
  1395.      =====================================================================
  1396.  
  1397.  
  1398.        Board Name               Number         Net/Node       Sysop
  1399.  
  1400.  
  1401.        *** United States ***
  1402.  
  1403.        C BBS               (703) 644-6478      1:109/307      Barry Lynch
  1404.        Burke, VA
  1405.  
  1406.  
  1407.        Eastern C Board     (201) 247-6748      1:107/335      Todd Lehr
  1408.  
  1409.        Exec-PC             (414) 964-5160        ..           Bob Mahoney
  1410.        Milwaukee, WI
  1411.  
  1412.        TAMIAMI             (813) 793-2392                     Gerhard Barth
  1413.        Naples, FL
  1414.  
  1415.        Sound of Music      (516) 536-8723(2400)               Paul Waldinger
  1416.                            (516) 536-6819(9600 Hayes V)
  1417.  
  1418.        *** CANADA ***
  1419.  
  1420.        Another BBS System  (416) 465-7752      1:148/208      Mark Bowman
  1421.        Toronto, Canada
  1422.  
  1423.        *** EUROPE ***
  1424.  
  1425.        Fido_N1_1            31-8350-37156      2:500/1        Henk Wevers
  1426.        The Netherlands
  1427.  
  1428.        DUBBS BBS             353-1-885634       n/a           Stephen Kearon
  1429.        Dublin, Ireland
  1430.  
  1431.  
  1432.        *** AUSTRALIA ***
  1433.  
  1434.        Sentry BBS             02-428-4687       ...           Trev Roydhouse
  1435.                  (300-2400) Non-Mail Times
  1436.                  (300-19,200) Mail Hour (Trailblazer)
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442.  
  1443.  
  1444.  
  1445.  
  1446.  
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.                                                                    Page  22
  1454.  
  1455.  
  1456.     C NEWS Vol. 2  Issue 14                                February 20, 1988
  1457.  
  1458.  
  1459.      =====================================================================
  1460.      USER RESPONSE FORM
  1461.      =====================================================================
  1462.  
  1463.           This form will be included as a regular feature in all
  1464.      future issues of C NEWS.
  1465.  
  1466.  
  1467.  
  1468.          What did you think of the content of this Issue?  _____________
  1469.  
  1470.  
  1471.          _______________________________________________________________
  1472.  
  1473.  
  1474.          What improvements can you think of that would make C News a
  1475.          better tool for the C Community?
  1476.  
  1477.          _______________________________________________________________
  1478.  
  1479.  
  1480.          _______________________________________________________________
  1481.  
  1482.  
  1483.  
  1484.          What is your favorite section or sections?  ___________________
  1485.  
  1486.  
  1487.          _______________________________________________________________
  1488.  
  1489.  
  1490.  
  1491.          What don't you like about C News?  ____________________________
  1492.  
  1493.  
  1494.          _______________________________________________________________
  1495.  
  1496.  
  1497.  
  1498.          Additional Comments:  _________________________________________
  1499.  
  1500.  
  1501.          _______________________________________________________________
  1502.  
  1503.  
  1504.          _______________________________________________________________
  1505.  
  1506.  
  1507.          _______________________________________________________________
  1508.  
  1509.  
  1510.  
  1511.  
  1512.  
  1513.  
  1514.  
  1515.  
  1516.  
  1517.  
  1518.  
  1519.                                                                    Page  23
  1520.  
  1521.